namespace test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            cv.Click += Cv_Click;
        }

        private void Cv_Click(object? sender, EventArgs e)
        {
            tvControls.Nodes.Clear();

            // 把当前窗口本身作为根节点添加到TreeView，显示窗口名称和类型
            TreeNode rootNode = tvControls.Nodes.Add($"{this.Name} ({this.GetType().Name})");
            TraverseControls(this.Controls, rootNode);

            if (this.MainMenuStrip != null)
            {
                // 给菜单栏创建一个节点，显示菜单栏名称和类型
                TreeNode menuRootNode = rootNode.Nodes.Add($"{MainMenuStrip.Name} ({MainMenuStrip.GetType().Name})");
                // 调用方法，递归遍历菜单栏里的所有菜单项
                TraverseMenuItems(MainMenuStrip.Items, menuRootNode);
            }
            tvControls.ExpandAll();
        }
        /// <param name="controls">要遍历的控件集合（比如窗口上的所有控件）</param>
        /// <param name="parentNode">这些控件要添加到的父节点（TreeView里的节点）</param>
        private void TraverseControls(Control.ControlCollection controls, TreeNode parentNode)
        {
            // 循环遍历每一个控件
            foreach (Control control in controls)
            {
                // 给当前控件创建一个节点，显示控件名称和控件类型（比如Button、TextBox）
                TreeNode node = parentNode.Nodes.Add($"{control.Name} ({control.GetType().Name})");

                // 如果当前控件是容器控件（比如Panel、GroupBox），里面还有子控件，就递归遍历
                if (control.HasChildren)
                {
                    TraverseControls(control.Controls, node);
                }
            }
        }

        /// <param name="items">要遍历的菜单项集合</param>
        /// <param name="parentNode">菜单项要添加到的父节点（TreeView里的节点）</param>
        private void TraverseMenuItems(ToolStripItemCollection items, TreeNode parentNode)
        {
            foreach (ToolStripItem item in items)
            {
                TreeNode node = parentNode.Nodes.Add($"{item.Text}");

                // 如果当前菜单项是下拉菜单（ToolStripMenuItem），并且有子菜单项，就递归遍历
                if (item is ToolStripMenuItem menuItem && menuItem.HasDropDownItems)
                {
                    TraverseMenuItems(menuItem.DropDownItems, node);
                }
            }
        }
    }
}